﻿#include <iostream>
#include <opencv2/opencv.hpp>
#include <filesystem>

using namespace cv;
using namespace std;
namespace fs = std::filesystem;

int main()
{
	// 获取当前可执行文件的路径
	fs::path exePath = fs::current_path();
	// 构建资源文件的完整路径
	fs::path imagePath = exePath / "x64\\Debug\\img\\C++.png";
	string imgPath_str = imagePath.generic_string();

	//OpenCV（Open Source Computer Vision Library）是一个开源的计算机视觉和机器学习软件库

	//加载图片: 图片路径、读取图像的方式
	Mat image = imread(imgPath_str, IMREAD_COLOR);
	//可调整窗体大小
	//namedWindow("图片显示窗口", WINDOW_FREERATIO);

	if (image.empty())
	{
		cout << "没有图像\n";
		return -1;
	}
	//显示图像
	imshow("原图片窗口", image);

	//获取图像的尺寸
	int height = image.rows;
	int width = image.cols;
	//图像的通道数
	int channels = image.channels();
	cv::Vec3b pixel = image.at<cv::Vec3b>(30, 60); // 访问(30, 60)处的像素值
	cout << "height=" << height << ",width=" << width << ",\n";


	//图像的创建与初始化
	//Mat newImage(400, 600, CV_8UC3, Scalar(0, 0, 255)); //创建一个红色图像
	//newImage.setTo(Scalar(255, 255, 255));//将图像初始化为白色

	//遍历像素：可以使用双重循环遍历图像的每个像素
	//for (int y = 0; y < image.rows; y++)
	//{
	//	for (int x = 0; x < image.cols; x++)
	//	{
	//		cv::Vec3b& pixel = image.at<cv::Vec3b>(y, x);
	//		// 对像素进行操作：可以直接修改像素的值。			
	//		pixel[0] = 255; // 将蓝色通道设置为255
	//		pixel[1] = 0;   // 将绿色通道设置为0
	//		pixel[2] = 0;   // 将红色通道设置为0
	//	}
	//}
	//imshow("纯色创建的图片", newImage);


	 // 转换为灰度图像
	Mat grayImage;
	cvtColor(image, grayImage, COLOR_BGR2GRAY);

	// 显示灰度图像
	imshow("灰度图像", grayImage);


	// 裁剪图像
	Rect roi(100, 100, 200, 200); // (x, y, width, height)
	Mat croppedImage = image(roi);

	// 缩放图像
	Mat resizedImage;
	resize(image, resizedImage, Size(400, 400)); // 缩放到400x400

	// 显示裁剪和缩放后的图像
	imshow("裁剪图像", croppedImage);
	imshow("缩放图像", resizedImage);


	// 复制图像
	Mat copiedImage = image.clone();
	// 修改复制的图像
	circle(copiedImage, Point(100, 100), 50, Scalar(0, 255, 0), 2); // 在复制的图像上画一个圆


	// 显示原始图像和修改后的图像
	imshow("复制图像", image);
	imshow("修改复制的图像", copiedImage);


	// 旋转图像
	Mat rotatedImage;
	Point2f center(image.cols / 2, image.rows / 2); // 旋转中心
	double angle = 45; // 旋转角度
	double scale = 1.0; // 缩放比例
	Mat rotationMatrix = getRotationMatrix2D(center, angle, scale);
	warpAffine(image, rotatedImage, rotationMatrix, image.size());

	// 显示旋转后的图像
	imshow("旋转图像", rotatedImage);





	//保存处理后的图像
	//imwrite("C++.png", image);

	waitKey(0);
	destroyAllWindows();


	return 0;

}
